#ifndef MICROGRIDMANAGER_H
#define MICROGRIDMANAGER_H

#include <QObject>
#include <QVector>
#include <QMap>
#include <QString>
#include "component.h"
#include "dieselgenerator.h"
#include "photovoltaic.h"
#include "energystorage.h"
#include "load.h"
#include "maingrid.h"

// 前向声明
class OptimizationAlgorithm;

class MicrogridManager : public QObject
{
    Q_OBJECT

public:
    explicit MicrogridManager(QObject* parent = nullptr);
    ~MicrogridManager();


    // 组件管理
    void addComponent(Component* component);
    bool removeComponent(const QString& name);
    Component* getComponent(const QString& name) const;
    QVector<Component*> getAllComponents() const;
    int getComponentCount() const;

    // 数据管理
    bool loadDataFromCSV(const QString& filename);
    bool saveResultsToCSV(const QString& filename);
    void importPriceData(const QVector<double>& prices);
    void importLoadProfile(const QVector<double>& profile);

    // 优化与调度
    void optimizeSchedule();
    void setOptimizationAlgorithm(OptimizationAlgorithm* algorithm);
    QVector<double> getOptimizationResult() const;

    // 仿真控制
    void startSimulation();
    void pauseSimulation();
    void stopSimulation();
    void resetSimulation();

    // 状态查询
    double getTotalPower() const;
    double getTotalCost() const;
    bool isSimulationRunning() const;
    int getCurrentTimeStep() const; // 新增：获取当前时间步

signals:
    // 仿真控制信号
    void simulationStarted();
    void simulationPaused();
    void simulationStopped();
    void simulationReset();

    // 优化信号
    void optimizationStarted();
    void optimizationProgress(int percent);
    void optimizationCompleted(const QVector<double>& result);

    // 组件管理信号
    void componentAdded(const QString& name, Component* component);
    void componentRemoved(const QString& name);
    void componentUpdated(const QString& name);

    // 错误信号
    void errorOccurred(const QString& errorMessage);

    // 状态更新信号
    void statusUpdated(const QString& statusMessage);
    void powerUpdated(double totalPower);
    void costUpdated(double totalCost);

public slots:
    // 响应外部事件的槽函数
    void onPriceDataChanged(const QVector<double>& newPrices);
    void onLoadProfileChanged(const QVector<double>& newProfile);
    void onComponentParameterChanged(const QString& componentName);

private:
    // 私有辅助方法
    void initializeComponents();
    void calculateTotalPower();
    void calculateTotalCost();
    bool validateComponent(Component* component) const;

    // 私有成员变量
    QMap<QString, Component*> componentsMap; // 使用名称作为键，便于快速查找
    QVector<double> optimizationResult;
    QVector<double> electricityPrices;
    QVector<double> loadProfile;
    OptimizationAlgorithm* optimizationAlgorithm;
    bool simulationRunning;
    double totalPower;
    double totalCost;
    int currentTimeStep;                     // 新增：当前时间步（0-95）

    // 私有常量
    static const int SIMULATION_TIME_STEPS = 96; // 24小时，每15分钟一个时间步
};

#endif // MICROGRIDMANAGER_H
